Plugins/Community Based Plugins/Microsoft Sentinel Custom Plugin Scenarios/Network beaconing ASIM plugin/PotentialNetworkBeaconingActivity.yaml (147 lines of code) (raw):

Descriptor: Name: Potential network beaconing activity DisplayName: Potential network beaconing activity Description: identifies beaconing patterns from Network traffic logs based on recurrent frequency patterns. Settings: - Name: TenantId Required: true - Name: WorkspaceName Required: true - Name: SubscriptionId Required: true - Name: ResourceGroupName Required: true SupportedAuthTypes: - None SkillGroups: - Format: KQL Skills: - Name: BeaconingActivity DisplayName: Potential network beaconing activity Description: identifies beaconing patterns from Network traffic logs based on recurrent frequency patterns. Inputs: - Name: querystarttime Description: Query start time Required: true - Name: queryendtime Description: Query end time Required: true - Name: TimeDeltaThreshold Description: Time Delta Threshold Required: false Settings: Target: Sentinel # The ID of the AAD Organization that the Sentinel workspace is in. TenantId: '{{TenantId}}' # The id of the Azure Subscription that the Sentinel workspace is in. SubscriptionId: '{{SubscriptionId}}' # The name of the Resource Group that the Sentinel workspace is in. ResourceGroupName: '{{ResourceGroupName}}' # The name of the Sentinel workspace. WorkspaceName: '{{WorkspaceName}}' # This query detects potential network beaconing activity Template: |- let querystarttime = 2d; let queryendtime = 1d; let TimeDeltaThreshold = 10; let TotalEventsThreshold = 15; let PercentBeaconThreshold = 80; let LocalNetworks=dynamic(["169.254.0.0/16", "127.0.0.0/8"]); _Im_NetworkSession(starttime=ago(querystarttime), endtime=ago(queryendtime)) | where not(ipv4_is_private(DstIpAddr)) | where not (ipv4_is_in_any_range(DstIpAddr, LocalNetworks)) | project TimeGenerated , SrcIpAddr , SrcPortNumber , DstIpAddr , DstPortNumber , DstBytes , SrcBytes ,DvcHostname ,DstDomain ,SrcProcessIntegrityLevel | sort by SrcIpAddr asc , TimeGenerated asc , DstIpAddr asc , DstPortNumber asc | serialize | extend nextTimeGenerated = next(TimeGenerated, 1) , nextSrcIpAddr = next(SrcIpAddr, 1) | extend TimeDeltainSeconds = datetime_diff('second', nextTimeGenerated, TimeGenerated) | where SrcIpAddr == nextSrcIpAddr //Whitelisting criteria/ threshold criteria | where TimeDeltainSeconds > TimeDeltaThreshold | project TimeGenerated , TimeDeltainSeconds , SrcIpAddr , SrcPortNumber , DstIpAddr , DstPortNumber , DstBytes , SrcBytes, DvcHostname, DstDomain, SrcProcessIntegrityLevel | summarize count() , sum(DstBytes) , sum(SrcBytes) , make_list(TimeDeltainSeconds) by TimeDeltainSeconds , bin(TimeGenerated, 1h) , SrcIpAddr , DstIpAddr , DstPortNumber, DvcHostname, DstDomain, SrcProcessIntegrityLevel | summarize (MostFrequentTimeDeltaCount, MostFrequentTimeDeltainSeconds) = arg_max(count_, TimeDeltainSeconds) , TotalEvents=sum(count_) , TotalSrcBytes = sum(sum_SrcBytes) , TotalDstBytes = sum(sum_DstBytes) by bin(TimeGenerated, 1h) , SrcIpAddr , DstIpAddr , DstPortNumber, DvcHostname, DstDomain, SrcProcessIntegrityLevel | extend BeaconPercent = MostFrequentTimeDeltaCount / toreal(TotalEvents) * 100 | extend MitreTactics="Command and Control" | extend MitreTechnique1 = "T1071 - Application Layer Protocol" | extend MitreTechnique2 = "T1571 - Non Standard Port" | where TotalEvents > TotalEventsThreshold | where BeaconPercent > PercentBeaconThreshold